banniere
BLUMAX WebSite
Espace privé
Adresse courriel :
Mot de passe :
Stat
  • 4 inscrits sur le site
  • 0 personne en ligne
  • 38 téléchargements
  • 34 articles
  • 65 réponses dans la FAQ
  • Les 2 derniers inscrits
    - Airwheel
    - PoPo
Articles - Développement Web - LEVENSHTEIN avec MySQL

Resumer : Cette article va vous permet de crée une fonction pour trouver les nom proche et similaire, par exemple le nom Stéphanie, peux aussi s'écrire Stephanie, Stéphani, ... Cette algo vous permettra de trouver ces correspondance.

Cette article va vous permet de crée une fonction pour trouver les nom proche et similaire, par exemple le nom Stéphanie, peux aussi s'écrire Stephanie, Stéphani, ... Cette algo vous permettra de trouver ces correspondance.
LEVENSHTEIN est une méthode de calcul pour trouver la différence entre deux chaine de caractère.

La fonction SOUNDEX (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex) permet de donner une coréspondance phonétique d'un mot mais cela en anglais et me semble pas adapté au but.

Il faut crée une fonction MySQL (Crée une fonction nécésiste les droit administrateur), exécuter donc :


DELIMITER $$
CREATE FUNCTION LEVENSHTEIN (s1 VARCHAR(255), s2 VARCHAR(255))
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
DECLARE s1_char CHAR;
DECLARE cv0, cv1 VARBINARY(256);
SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
IF s1 = s2 THEN
RETURN 0;
ELSEIF s1_len = 0 THEN
RETURN s2_len;
ELSEIF s2_len = 0 THEN
RETURN s1_len;
ELSE
WHILE j <= s2_len DO
SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
END WHILE;
WHILE i <= s1_len DO
SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
WHILE j <= s2_len DO
SET c = c + 1;
IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
IF c > c_temp THEN SET c = c_temp; END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
IF c > c_temp THEN SET c = c_temp; END IF;
SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
END WHILE;
SET cv1 = cv0, i = i + 1;
END WHILE;
END IF;
RETURN c;
END$$
DELIMITER ;


Vous pouvez utiliser cette fonctions comme cela pour trouver la valeur du LEVENSHTEIN :
SELECT LEVENSHTEIN('BluX', 'BliX');


Si vous souhaiter trouver les nom les plus proche :
SELECT * FROM levenshtein WHERE LEVENSHTEIN(util_nom, 'Stéphanie') < 6


Strcture de la DB de test :
CREATE TABLE levenshtein (
util_id int(11) NOT NULL auto_increment,
util_nom varchar(255) NOT NULL,
PRIMARY KEY (util_id)
) ENGINE=InnoDB;


Par Blumax le 17/04/2015
Aucun commentaire
Vous devez vous connecter pour poster un commentaire
© 2004-2024 blumax.fr